Welcome to Hands on deep learning!

02.01.04 索引和切片

就像在任何其他Python数组中一样,张量中的元素可以通过索引访问。 与任何Python数组一样:第一个元素的索引是0,最后一个元素索引是-1; 可以指定范围以包含第一个元素和最后一个之前的元素。

如下所示,我们可以用[-1]选择最后一个元素,可以用[1:3]选择第二个和第三个元素:

import torch

X = torch.arange(12, dtype=torch.float32).reshape((3,4))

print(X)

print(X[-1])

print(X[1:3])

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.]])

tensor([ 8., 9., 10., 11.])

tensor([[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.]])

除读取外,我们还可以通过指定索引来将元素写入矩阵。

import torch

X = torch.arange(12, dtype=torch.float32).reshape((3,4))

print(X)

X[1, 2] = 99

print(X)

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.]])

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 99., 7.],

[ 8., 9., 10., 11.]])

如果我们想为多个元素赋值相同的值,我们只需要索引所有元素,然后为它们赋值。 例如,[0:2, :]访问第1行和第2行,其中“:”代表沿轴1(列)的所有元素。 虽然我们讨论的是矩阵的索引,但这也适用于向量和超过2个维度的张量。

import torch

X = torch.arange(12, dtype=torch.float32).reshape((3,4))

X[0:2, :] = 99

print(X)

返回值:

tensor([[99., 99., 99., 99.],

[99., 99., 99., 99.],

[ 8., 9., 10., 11.]])